package com.epadmin.finanse.wydatki;

import java.math.BigDecimal;
import java.util.Date;

import com.ep.general.ActionSupportCustom;
import com.ep.general.admin.Administrator;
import com.epadmin.app.login.LoginRequierd;

public class WydatekAction extends ActionSupportCustom<Administrator> implements LoginRequierd {

	private static final long serialVersionUID = 7626112204181918328L;
	private final String WYDATEK_KEY = "wydatekItem";
	private WydatekForm form;
	private int wydatekId;
	private WydatekMdt wydatekMdt;

	@Override
	public String execute() throws Exception {
		return SUCCESS;
	}

	public String list() {
		setDataArray(new WydatekView().getData());
		return DATA_ARRAY;
	}
	
	public String listGrouppedByMonth() {
		setDataArray(new WydatekView().getGroupByMonthData());
		return DATA_ARRAY;
	}

	public String add() {
		getForm().setNazwa("");
		getForm().setKwota(BigDecimal.ZERO);
		getForm().setDate(new Date());

		getSession().remove(WYDATEK_KEY);
		getSession().put(WYDATEK_KEY, getForm());

		return EDIT;
	}

	public String edit() {
		getSession().remove(WYDATEK_KEY);
		Wydatek wydatek = getWydatekMdt().get(getWydatekId());

		if (wydatek == null) {
			setText("Brak wydatku");
			return TEXT_RESULT;
		}
		getForm().setData(wydatek);
		getSession().put(WYDATEK_KEY, getForm());

		return EDIT;
	}

	public String delete() {
		Wydatek wydatek = getWydatekMdt().get(getWydatekId());

		if (wydatek == null) {
			setText("Brak wydatku");
			return TEXT_RESULT;
		}

		getWydatekMdt().delete(wydatek);

		setText("Wydatek został poprawnie usunięty");
		return TEXT_RESULT;
	}

	public String save() {
		Wydatek wydatekEdytowany = ((WydatekForm) getSession().get(WYDATEK_KEY)).getData();
		Wydatek wydatekNowy = getForm().getData();

		if (wydatekEdytowany == null) {
			setText("Brak wydatku !");
			return TEXT_RESULT;
		}

		if (!isValid(getForm().getData())) {
			return TEXT_RESULT;
		}

		if (!wydatekEdytowany.compareAndCopy(wydatekNowy)) {
			setText("Brak zmian po edycji !");
			return TEXT_RESULT;
		}

		getWydatekMdt().makePersistent(wydatekEdytowany);
		getSession().remove(WYDATEK_KEY);
		//
		setText("Wydatek został poprawnie zmieniony");
		return TEXT_RESULT;
	}

	public String saveNew() {
		if (getForm().getData() == null) {
			setText("Brak wydatku");
			return TEXT_RESULT;
		}

		if (!isValid(getForm().getData())) {
			return TEXT_RESULT;
		}

		getWydatekMdt().makePersistent(getForm().getData());

		getSession().remove(WYDATEK_KEY);
		setText("Nowy wydatek został poprawnie dodany");

		return TEXT_RESULT;
	}

	private boolean isValid(Wydatek item) {
		if (item.getNazwa().length() < 5) {
			setText("Wymagana długość nazwy wydatku to pięć znaków !");
			return false;
		}
		return true;
	}

	public WydatekForm getForm() {
		if (form == null)
			form = new WydatekForm();
		return form;
	}

	public void setForm(WydatekForm form) {
		this.form = form;
	}

	private WydatekMdt getWydatekMdt() {
		if (wydatekMdt == null)
			wydatekMdt = new WydatekMdt();
		return wydatekMdt;
	}

	public int getWydatekId() {
		return wydatekId;
	}

	public void setWydatekId(int wydatekId) {
		this.wydatekId = wydatekId;
	}
}
